from sqlalchemy import select, desc
from  数据库 import 获取会话, 虎码


def 统计靠前的字():
    靠前的字: dict[str, set] = {}
    
    with 获取会话() as 会话:
        表 = 会话.execute(
            select(虎码.字符)
            .order_by(desc(虎码.频数))
            .limit(6000)
        ).scalars().all()
    
        靠前的字['前300'] = set(表[:300])
        靠前的字['前500'] = set(表[300:500])
        靠前的字['前1500'] = set(表[500:1500])
        靠前的字['前3000'] = set(表[1500:3000])
        靠前的字['前6000'] = set(表[3000:])
    return 靠前的字



def 统计数据():
    靠前的字 = 统计靠前的字()
    分组统计 = {}
    for 键 in 靠前的字.keys():
        分组统计.setdefault(键, [0, 0, 0])

    with 获取会话() as 会话:
        表 = 会话.execute(
            select(虎码)
            .order_by(desc(虎码.频数))
            .limit(6000)
        ).scalars()
        二简计数 = 0
        二简频数 = 0
        for 行 in 表:
            for 键, 集合 in 靠前的字.items():
                if 行.字符 in 集合:
                    if 行.二简:
                        分组统计[键][0] += 1
                        二简计数 += 1
                        二简频数 += 行.频数
                    elif 行.三简 or len(行.全码) == 3:
                        分组统计[键][1] += 1
                    else:
                        分组统计[键][2] += 1

    return 分组统计, 二简计数, 二简频数



def 检测全码重(限数 = 0):
    with 获取会话() as 会话:
        重码 = {}
        表 = 会话.execute(
            select(虎码)
            .order_by(desc(虎码.频数))
            .limit(限数)
        ).scalars()
        for 行 in 表:
            if 行.一简:
                if 行.一简 not in 重码:
                    重码[行.一简] = [行.字符, ]
                else:
                    重码[行.一简].append(行.字符)
            elif 行.二简:
                if 行.二简 not in 重码:
                    重码[行.二简] = [行.字符, ]
                else:
                    重码[行.二简].append(行.字符)
            elif 行.三简:
                if 行.三简 not in 重码:
                    重码[行.三简] = [行.字符, ]
                else:
                    重码[行.三简].append(行.字符)
            else:
                if 行.全码 not in 重码:
                    重码[行.全码] = [行.字符, ]
                else:
                    重码[行.全码].append(行.字符)

        重码 = {键: 值 for 键, 值 in 重码.items() if len(值) > 1}
        重码 = {键: 值[1:] for 键, 值 in 重码.items()}

        return 重码

if __name__ == '__main__':
    统计数据()